package aufgabe6;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MueslieBar {

	/**
	 * Regal Fuer die Mueslie
	 */
	private Map<Integer, Mueslie> vorhandene_muslie;
	/**
	 * Integer zur Nummerrierung der Mueslie
	 */
	private int mueslie_ids;
	
	/**
	 * Erstellen einer Lehren Muesliebar
	 */
	public MueslieBar(){
		this.vorhandene_muslie = new HashMap<Integer, Mueslie>();
		mueslie_ids = 1;
	}
	
	/**
	 * Erstellen einer nicht Lehren Muesliebar
	 * @param mueslies Eine HashMap<Integer, Mueslie> mit Mueslies
	 */
	private MueslieBar(Map<Integer, Mueslie> mueslies, int mueslie_ids){
		this.vorhandene_muslie = mueslies;
		
		//Einstellen der ID
		this.mueslie_ids = mueslie_ids;
		for(Integer id : vorhandene_muslie.keySet()){
			if(this.mueslie_ids < id){this.mueslie_ids = id;}
		}
		this.mueslie_ids++;
	}
	
	/**
	 * Hinzufuegen eines Mueslies
	 * @param volum Das Volume des Mueslies
	 * @param preis Der Volume des Mueslies
	 */
	public void addMueslie(int volum, int preis){
		Mueslie new_mueslie = new Mueslie(volum, preis, mueslie_ids);
		this.vorhandene_muslie.put(mueslie_ids, new_mueslie);
		mueslie_ids++;
	}
	
	/**
	 * Gibt das mueslie mit der gewuenschten ID zurueck
	 * Wirft eine Exception wenn das Mueslie nicht vorhanden ist
	 * @param id Die ID der Gewuenschten Mueslie
	 * @return Das Mueslie
	 */
	public Mueslie getMueslie(int id){
		if(!this.vorhandene_muslie.containsKey(id)){
			throw new IllegalArgumentException("Mueslie: " + id + ", existiert nicht");
		}
		return this.vorhandene_muslie.get(id);
	}
	
	/**
	 * Giebt eine Liste Mit allen Mueslie ID's der MueslieBar zuruck 
	 * @return Eine ListeMit den ID's
	 */
	public List<Integer> getVorhandendeMueslie(){
		List<Integer> result = new ArrayList<Integer>(vorhandene_muslie.keySet());
		return result;
	}

	/**
	 * Kopiert die Ganze Mueslibar Einmahl
	 * @return Die Koppi der MuslieBar mit den Refernzen auf die selben Mueslie
	 */
	public MueslieBar coppyMueslieBar() {
		
		Map<Integer, Mueslie> new_vorhandene_muslie = new HashMap<Integer, Mueslie>();
		
		for(Integer id : vorhandene_muslie.keySet()){
			new_vorhandene_muslie.put(id, vorhandene_muslie.get(id));
		}
		MueslieBar new_mueslie_bar = new MueslieBar(new_vorhandene_muslie, mueslie_ids);
		return new_mueslie_bar;
	}
	
	/**
	 * Entfehrnt ein Mueslie aus der MueslieBar
	 * @param mueslie_id Die ID des Mueslie das entfehrnt werden soll
	 * @return Die Muesliebar mit dem entfehrnten Mueslie
	 */
	public MueslieBar removeMueslie(int mueslie_id){
		vorhandene_muslie.remove(mueslie_id);
		return this;
	}
	
	/**
	 * Erstellt eine Koppie der MueslieBar unt entfehrnt ein Mueslie daraus
	 * @param mueslie_id Die Id des zu entfehrnenden Mueslies
	 * @return Die Koppierte MuesliBar Mit dem entfernten Mueslie
	 */
	public MueslieBar coppyRemove(int mueslie_id){
		MueslieBar new_mueslie_bar = this.coppyMueslieBar();
		new_mueslie_bar.removeMueslie(mueslie_id);
		return new_mueslie_bar;
	}
}
